package com.xk._04regEx;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @description: 演示非捕获分组，语法比较奇怪
 * @author: xu
 * @date: 2022/11/1 13:45
 */
public class RegExp_08 {
    public static void main(String[] args) {
        String content = "hello韩顺平教育 jack韩顺平老师 韩顺平同学hello 韩顺平学生";
        // 找到 韩顺平教育 韩顺平老师 韩顺平同学 子字符串
        // 1. 选择匹配符 --> 韩顺平教育|韩顺平老师|韩顺平同学
        // 2. 非捕获分组 --> 韩顺平(?:教育|老师|同学)

        // 找到 韩顺平 这个关键字，但是要求只是查找 韩顺平教育 和 韩顺平老师 中包含有的韩顺平
        // 非捕获分组 [不能使用matcher.group(1)获取] --> 韩顺平(?=教育|老师)

        // 找到 韩顺平 这个关键字，但是要求只是查找不是 韩顺平教育 和 韩顺平老师 中包含有的韩顺平
        // 非捕获分组 --> 韩顺平(?!教育|老师)
        String regStr = "韩顺平(?!教育|老师)";

        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) {
            System.out.println("找到：" + matcher.group(0));
        }
    }
    /*
    * 小结：
    * (?:pattern) :
    *       匹配 pattern 但不捕获该匹配的子表达式，即它是一个非捕获匹配，不存储供以后使用的匹配。这对于
    *       用"or"字符(|)组合模式部件的情况很有用。
    *       例如："industr(?:y|ies)" 是比 "industry|industries" 更经济的表达式
    * (?=pattern) :
    *       它是一个非捕获匹配。
    *       例如："Windows(?=95|98|NT|2000)" 匹配 "Windows2000" 中的 "Windows"，
    *       但不匹配 "Windows3.1" 中的 "Windows"。
    * (?!pattern) :
    *       该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配。
    *       例如："Windows(?!95|98|NT|2000)" 匹配 "Windows3.1" 中的 "Windows"，
    *       但不匹配 "Windows2000" 中的 "Windows"。
    * */
}
